package cn.com.pc.content.support.baby;

import cn.com.pc.content.domain.content.Content;
import cn.com.pc.content.domain.content.ContentType;
import cn.com.pc.content.domain.view.PostView;
import cn.com.pc.content.domain.view.ViewConverter;
import cn.com.pc.content.dto.ContentDTO;
import cn.com.pc.content.dto.PostDTO;
import cn.com.pc.content.util.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 亲子快妈 帖子转换AppView
 * bean 名称为PCBabyHappyMomPostToAppViewConverter，该名称存入数据库content_view_property的converter列
 */
@Slf4j
@Service("PCBabyHappyMomPostToAppViewConverter")
public class PCBabyHappyMomPostToAppViewConverter implements ViewConverter {

    // 定义script的正则表达式{或<script[^>]*?>[//s//S]*?<///script>
    private static final String REG_EX_SCRIPT = "<[//s]*?script[^>]*?>[//s//S]*?<[//s]*?///[//s]*?script[//s]*?>";

    // 定义style的正则表达式{或<style[^>]*?>[//s//S]*?<///style>
    private static final String REG_EX_STYLE = "<[//s]*?style[^>]*?>[//s//S]*?<[//s]*?///[//s]*?style[//s]*?>";

    private static final String REG_EX_NBSP = "&nbsp;";

    // 定义HTML标签的正则表达式
    private static final String REG_EX_HTML = "<[^>]+>";
    private static final String REG_EX_HTML1 = "<[^>]+";
    private static final Pattern SCRIPT_PATTERN = Pattern.compile(REG_EX_SCRIPT, Pattern.CASE_INSENSITIVE);
    private static final Pattern STYLE_PATTERN = Pattern.compile(REG_EX_STYLE, Pattern.CASE_INSENSITIVE);
    private static final Pattern HTML_PATTERN = Pattern.compile(REG_EX_HTML, Pattern.CASE_INSENSITIVE);
    private static final Pattern HTML1_PATTERN = Pattern.compile(REG_EX_HTML1, Pattern.CASE_INSENSITIVE);
    private static final Pattern NBSP_PATTERN = Pattern.compile(REG_EX_NBSP, Pattern.CASE_INSENSITIVE);

    /**
     * 帖子正文，把html转换为纯文本
     *
     * @param content    数据库中已有内容数据（创建内容时即为contentDTO，更新内容时为数据库中已有内容数据）
     * @param contentDTO 接口或kafka 传入的内容数据（创建内容时需要设为null）
     * @param viewType   视图类型
     * @return 转换后视图文本
     */
    @Override
    @SuppressWarnings("Duplicates")
    public String convert(Content content, ContentDTO contentDTO, String viewType) {
        //获取需要转换的正文（含html标签的字符串）和原视图oldView
        String text = content.getSummary();
        PostView postView = new PostView();
        BeanUtils.copyProperties(content, postView);
        String oldView = postView.getViewData() == null ?
                null : postView.getViewData().getOrDefault(viewType, null);

        //判断更新内容时是否需要视图转换：判断更新前后正文是否一样，一样则不进行视图转换，返回原视图文本
        if (contentDTO != null && StringUtils.hasText(oldView)) {
            PostDTO postDTO = new PostDTO();
            BeanUtils.copyProperties(contentDTO, postDTO);
            //更新内容时，更新参数中的正文
            String newText = postDTO.getSummary();
            //更新参数中text 和原文章text 一样，则重新不进行视图转换
            if (StringUtils.hasText(newText) &&
                    StringUtils.hasText(text) &&
                    newText.equals(text)) {
                log.debug("Text is not update ,not need to View Convert ,contentType({}),Site({}),contentId({})/referId({});",
                        ContentType.Post, content.getSite(), content.getId(), content.getReferId());
                return oldView;
            }

            //原文章text 更新为更新参数中text
            text = newText;
        }

        //text 为空则不进行视图转换，避免更新文章时不更新text字段导致视图view为空
        if (!StringUtils.hasText(text)) {
            log.debug("Text is blank ,not need to View Convert，contentType({}),Site({}),contentId({})/referId({});",
                    ContentType.Post, content.getSite(), content.getId(), content.getReferId());
            return null;
        }

        //视图转换代码，由业务方提供
        try {
            // 过滤script标签
            Matcher scriptMatcher = SCRIPT_PATTERN.matcher(text);
            text = scriptMatcher.replaceAll("");

            // 过滤style标签
            Matcher styleMatcher = STYLE_PATTERN.matcher(text);
            text = styleMatcher.replaceAll("");

            // 过滤html标签
            Matcher htmlMatcher = HTML_PATTERN.matcher(text);
            text = htmlMatcher.replaceAll("");

            // 过滤html标签
            Matcher html1Matcher = HTML1_PATTERN.matcher(text);
            text = html1Matcher.replaceAll("");

            // 过滤&nbsp符号
            Matcher nbspMatcher = NBSP_PATTERN.matcher(text);
            text = nbspMatcher.replaceAll("");

            log.debug("To View Convert success Site({}),Biz({}),contentId({})/referId({});",
                    content.getSite(), content.getBiz(), content.getId(), content.getReferId());
        } catch (Exception e) {
            log.error("To View Convert error Site({}),Biz({}),contentId({})/referId({}):",
                    content.getSite(), content.getBiz(), content.getId(), content.getReferId(), e);
            return null;
        }

        // 返回文本字符串
        return text;
    }
}
